XLA更新は、同期または非同期に受信できます。
トピックの更新を同期をとって受信および処理するには、次の手順を実行します。
receive
またはreceiveNoWait
をコールして、次に使用可能な更新を取得します。トピックの更新を非同期に受信および処理するには、次の手順を実行します。
TopicSubscriber
を作成してトピックをサブスクライブします。TopicSubscriber
にMessageListener
を登録します。Object.wait
をコールしてメッセージを待機できます。 更新がパブリッシュされると、MessageListener onMessage
メソッドがコールされ、メッセージがMapMessage
として渡されます。
SYS.XLASUBSCRIPTIONSシステム表を確認することで、アプリケーションで表のサブスクリプションを検証できます。
XlaLevel1デモは、リスナーを使用して更新を非同期に処理します。例3.6を参照してください。
MyListener myListener = new MyListener(outStream);
outStream.println("Creating consumer for topic " + topic);
Topic xlaTopic = session.createTopic(topic);
TopicSubscriber subscriber =
session.createDurableSubscriber(xlaTopic, "mybookmark");
subscriber.setMessageListener(myListener);
mybookmark
がすでに存在している必要があります。JDBCおよびttXlaBookmarkCreate組込みプロシージャを使用して、ブックマークを作成できます。また、TopicSubscriber
は、永続サブスクライバである必要があります。XLA接続は永続的であるように設計されています。XLAブックマークによって、トピックからの切断が可能になり、更新が中断した位置から更新の受信を開始するために、再度接続することもできます。永続サブスクライバの作成時にサブスクリプション識別子として渡すString
は、XLAブックマーク名として使用されます。
JMS TopicSessionでunsubscribe
をコールして、アプリケーションの停止時にそのサブスクライバで使用したXLAブックマークを削除できます。これによって、アプリケーションの再起動時に、新しいブックマークが作成されます。
更新を受信すると、MapMessage取得メソッドを使用してメッセージから情報を抽出し、アプリケーションで必要な処理を行うことができます。TimesTen XlaConstants.java
クラスでは、XLA更新メッセージの処理を簡単にするために、更新タイプおよび特別なメッセージ・フィールドの定数が定義されています。
通常、メッセージに含める更新タイプを最初に決定します。MapMessage.getInt
メソッドを使用して__TYPE
フィールドの内容を取得し、the XlaConstants
クラスで定義されている数値定数とその値を比較します。
XlaLevel1
デモでは、MySubscriberのonMessage
メソッドはMapMessage
から更新タイプを抽出し、更新が示している処理を表示します。例3.7を参照してください。
public void onMessage(Message message) {
MapMessage mapMessage = (MapMessage) message;
String messageType = null;
if (message == null) {
errStream.println("MyListener: update message is null");
return;
}
try {
// Get the update type(insert, update, delete, etc.).
int type = mapMessage.getInt(XlaConstants.TYPE_FIELD);
if (type == XlaConstants.INSERT) {
System.out.println("A row was inserted.");
} else if (type == XlaConstants.UPDATE) {
System.out.println("A row was updated.");
} else if (type == XlaConstants.DELETE) {
System.out.println("A row was deleted.");
} else {
return;
}
受信したメッセージのタイプがわかれば、アプリケーションにおける必要性に応じて、メッセージを処理できます。メッセージのすべてのフィールドのリストを取得するには、MapMessage.getMapNames
をコールします。メッセージの個々のフィールドを名前ごとに取得できます。
たとえば、XlaLevel1デモでは、列名を使用して、挿入、更新および削除メッセージから列値を抽出します。例3.8を参照してください。
if (type == XlaConstants.INSERT
|| type == XlaConstants.UPDATE
|| type == XlaConstants.DELETE) {
// Get the column values from the message.
int cust_num = mapMessage.getInt("cust_num");
String region = mapMessage.getString("region");
String name = mapMessage.getString("name");
String address = mapMessage.getString("address");
System.out.println("New Column Values:");
System.out.println("cust_num=" + cust_num);
System.out.println("region=" + region);
System.out.println("name=" + name);
System.out.println("address=" + address);
}
XLA更新メッセージの内容の詳細は、「XLA MapMessageの内容」を参照してください。 また、TimesTenの列の型がどのようにJMSデータ型にマップされているか、および列値を取得するために使用する取得メソッドについては、「データ型のマッピング」を参照してください。